#include <ESP8266WiFi.h>
#include <SimpleTask.h>
#include "Common.h"
#include "MyWiFi.h"
#include "MyWebServer.h"
#include "MyMqtt.h"
#include "BlockFileHandler.h"

MyWiFi      _myWiFi;
MyWebServer _myWeb;
MyMqtt      _myMqtt;
String      _config[7];
SimpleTask  _taskScheduler;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void mqttTask()
{
    _myMqtt.stateMachine();
}

void webTask()
{
    _myWeb.stateMachine();
}

void wifiTask()
{
    _myWiFi.stateMachine();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void callback(char* topic, uint8_t* msg, uint16_t len)
{
    String tmpTopic = topic;
    String tmpMsg = "";
    int    pinStat = LOW;

    LOG_F("[Main] mqtt callback TOPIC:[%s] LEN:[%d]", topic, len);

    //解析订阅消息
    for (int idx=0; idx<len; idx++) {
        tmpMsg += (char) msg[idx];
    }
    pinStat = (tmpMsg.compareTo("on") == 0) ? HIGH : LOW;
    LOG_F("[Main] mqtt pin status:[%d]", pinStat);
    
    //设置引脚状态
    if (tmpTopic.compareTo(_config[5]) == 0) {
        digitalWrite(0, pinStat);
        LOG("[Main] mqtt pin 0 set");
    }
    else if(tmpTopic.compareTo(_config[6]) == 0) {
        digitalWrite(2, pinStat);
        LOG("[Main] mqtt pin 2 set");
    }
    else {
        LOG("[Main] mqtt isn't subcribe");
    }
}

void pinInit()
{
    pinMode(0, OUTPUT);
    pinMode(2, OUTPUT);
    digitalWrite(0, LOW);
    digitalWrite(2, LOW);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup()
{
    LOG("[Main] sys init...");
    Serial.begin(9600);
    SPIFFS.begin();

    //读取配置
    BlockFileHandler bfh;
    bfh.read(CONFIG_FILE, _config, 7);

    //配置WiFi
    _myWiFi.configArg(_config[0], _config[1]);

    //配置MQTT
    _myMqtt.configArg(_config[2].c_str(), _config[3].toInt(), _config[4].c_str(), _config[5].c_str(), _config[6].c_str(), callback);

    //配置引脚
    pinInit();

    //创建任务
    _taskScheduler.createTask(wifiTask, WIFI_CYCLE);
    _taskScheduler.createTask(mqttTask, MQTT_CYCLE);
    _taskScheduler.createTask(webTask, WEBSERVER_CYCLE);
}


void loop()
{
    _taskScheduler.taskScheduler();
    delay(1);
}